/*!
 * \file WtUftEngine.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 超高频交易引擎定义文件
 * 
 * \details 本文件定义了WtUftEngine类，是WonderTrader超高频交易框架的核心引擎。
 *          超高频交易引擎的主要功能包括：
 *          - 实时市场数据处理和分发
 *          - 超高频策略上下文管理
 *          - 订单薄和交易明细数据管理
 *          - Level2数据的实时处理
 *          - 多策略并发执行支持
 *          - 低延迟交易执行环境
 */
#pragma once

#include <queue>
#include <functional>
#include <stdint.h>

#include "ParserAdapter.h"

#include "../Includes/FasterDefs.h"
#include "../Includes/RiskMonDefs.h"

#include "../Share/StdUtils.hpp"
#include "../Share/DLLHelper.hpp"

#include "../Share/BoostFile.hpp"

#include "../Includes/IUftStraCtx.h"

NS_WTP_BEGIN
class WTSSessionInfo;
class WTSCommodityInfo;
class WTSContractInfo;

class IBaseDataMgr;
class IHotMgr;

class WTSVariant;

class WTSTickData;
struct WTSBarStruct;
class WTSTickSlice;
class WTSKlineSlice;
class WTSPortFundInfo;

class WtUftDtMgr;
class TraderAdapterMgr;

class EventNotifier;

/*!
 * \typedef TaskItem
 * \brief 任务项类型定义
 * 
 * \details 定义了任务队列中的任务项，用于异步执行各种操作。
 */
typedef std::function<void()>	TaskItem;


class WTSVariant;
class WtUftRtTicker;

/*!
 * \typedef UftContextPtr
 * \brief UFT策略上下文智能指针类型定义
 * 
 * \details 定义了UFT策略上下文的智能指针类型，用于管理策略上下文的生命周期。
 */
typedef std::shared_ptr<IUftStraCtx> UftContextPtr;

/*!
 * \class WtUftEngine
 * \brief 超高频交易引擎类
 * 
 * \details WtUftEngine是WonderTrader超高频交易框架的核心引擎，继承自IParserStub接口。
 *          该引擎专门设计用于处理超高频交易场景，具有极低的延迟和高吞吐量。
 *          
 *          主要特性：
 *          - 微秒级别的数据处理延迟
 *          - Level2市场数据的完整支持
 *          - 订单薄重构和维护
 *          - 多策略并发执行
 *          - 实时风控监控
 *          - 高精度时间戳管理
 *          
 *          核心功能：
 *          - 市场数据实时接收和处理
 *          - 策略信号的快速响应
 *          - 订单执行的极速通道
 *          - 持仓和资金的实时监控
 *          - 系统性能的实时统计
 *          
 *          使用场景：
 *          - 高频套利策略
 *          - 做市商策略
 *          - 算法交易执行
 *          - 统计套利
 *          - 延迟敏感型策略
 */
class WtUftEngine : public IParserStub
{
public:
	/*!
	 * \brief 构造函数
	 * 
	 * \details 初始化超高频交易引擎的各种组件和成员变量。
	 */
	WtUftEngine();
	
	/*!
	 * \brief 析构函数
	 * 
	 * \details 清理资源，确保引擎安全退出。
	 */
	virtual ~WtUftEngine();

public:
	/*!
	 * \brief 设置交易适配器管理器
	 * 
	 * \param mgr 交易适配器管理器指针
	 * 
	 * \details 设置交易适配器管理器，用于管理各种交易接口的适配器。
	 */
	inline void set_adapter_mgr(TraderAdapterMgr* mgr) { _adapter_mgr = mgr; }

	/*!
	 * \brief 设置当前日期时间
	 * 
	 * \param curDate 当前日期
	 * \param curTime 当前时间
	 * \param curSecs 当前秒数，默认为0
	 * \param rawTime 原始时间，默认为0
	 * 
	 * \details 设置引擎的当前时间信息，用于时间同步和策略执行的时间基准。
	 */
	void set_date_time(uint32_t curDate, uint32_t curTime, uint32_t curSecs = 0, uint32_t rawTime = 0);

	/*!
	 * \brief 设置交易日期
	 * 
	 * \param curTDate 当前交易日期
	 * 
	 * \details 设置当前的交易日期，用于交易日历管理。
	 */
	void set_trading_date(uint32_t curTDate);

	/*!
	 * \brief 获取当前日期
	 * 
	 * \return 当前日期
	 * 
	 * \details 获取引擎当前的日期信息。
	 */
	inline uint32_t get_date() { return _cur_date; }
	
	/*!
	 * \brief 获取当前分钟时间
	 * 
	 * \return 当前分钟时间
	 * 
	 * \details 获取引擎当前的分钟级时间信息。
	 */
	inline uint32_t get_min_time() { return _cur_time; }
	
	/*!
	 * \brief 获取原始时间
	 * 
	 * \return 原始时间
	 * 
	 * \details 获取引擎当前的原始时间戳。
	 */
	inline uint32_t get_raw_time() { return _cur_raw_time; }
	
	/*!
	 * \brief 获取当前秒数
	 * 
	 * \return 当前秒数
	 * 
	 * \details 获取引擎当前的秒级时间信息。
	 */
	inline uint32_t get_secs() { return _cur_secs; }
	
	/*!
	 * \brief 获取交易日期
	 * 
	 * \return 交易日期
	 * 
	 * \details 获取引擎当前的交易日期。
	 */
	inline uint32_t get_trading_date() { return _cur_tdate; }

	/*!
	 * \brief 获取基础数据管理器
	 * 
	 * \return 基础数据管理器指针
	 * 
	 * \details 获取引擎的基础数据管理器，用于获取合约、商品等基础信息。
	 */
	inline IBaseDataMgr*		get_basedata_mgr() { return _base_data_mgr; }
	
	/*!
	 * \brief 获取交易时段信息
	 * 
	 * \param sid 时段标识
	 * \param isCode 是否为代码，默认为false
	 * \return 交易时段信息指针
	 * 
	 * \details 根据标识获取对应的交易时段信息。
	 */
	WTSSessionInfo*		get_session_info(const char* sid, bool isCode = false);
	
	/*!
	 * \brief 获取商品信息
	 * 
	 * \param stdCode 标准合约代码
	 * \return 商品信息指针
	 * 
	 * \details 根据标准合约代码获取对应的商品信息。
	 */
	WTSCommodityInfo*	get_commodity_info(const char* stdCode);
	
	/*!
	 * \brief 获取合约信息
	 * 
	 * \param stdCode 标准合约代码
	 * \return 合约信息指针
	 * 
	 * \details 根据标准合约代码获取对应的合约详细信息。
	 */
	WTSContractInfo*	get_contract_info(const char* stdCode);

	/*!
	 * \brief 获取最新Tick数据
	 * 
	 * \param sid 策略ID
	 * \param stdCode 标准合约代码
	 * \return Tick数据指针
	 * 
	 * \details 获取指定合约的最新Tick行情数据。
	 */
	WTSTickData*	get_last_tick(uint32_t sid, const char* stdCode);
	
	/*!
	 * \brief 获取Tick数据切片
	 * 
	 * \param sid 策略ID
	 * \param stdCode 标准合约代码
	 * \param count 数据条数
	 * \return Tick数据切片指针
	 * 
	 * \details 获取指定合约的历史Tick数据切片。
	 */
	WTSTickSlice*	get_tick_slice(uint32_t sid, const char* stdCode, uint32_t count);
	
	/*!
	 * \brief 获取K线数据切片
	 * 
	 * \param sid 策略ID
	 * \param stdCode 标准合约代码
	 * \param period 周期类型
	 * \param count 数据条数
	 * \param times 时间倍数，默认为1
	 * \param etime 结束时间，默认为0
	 * \return K线数据切片指针
	 * 
	 * \details 获取指定合约的K线数据切片。
	 */
	WTSKlineSlice*	get_kline_slice(uint32_t sid, const char* stdCode, const char* period, uint32_t count, uint32_t times = 1, uint64_t etime = 0);

	/*!
	 * \brief 订阅Tick数据
	 * 
	 * \param sid 策略ID
	 * \param code 合约代码
	 * 
	 * \details 为指定策略订阅合约的Tick数据推送。
	 */
	void sub_tick(uint32_t sid, const char* code);

	/*!
	 * \brief 获取当前价格
	 * 
	 * \param stdCode 标准合约代码
	 * \return 当前价格
	 * 
	 * \details 获取指定合约的当前最新价格。
	 */
	double get_cur_price(const char* stdCode);

public:
	/*!
	 * \brief 初始化引擎
	 * 
	 * \param cfg 配置参数
	 * \param bdMgr 基础数据管理器
	 * \param dataMgr UFT数据管理器
	 * 
	 * \details 使用配置参数初始化超高频交易引擎的各个组件。
	 */
	void init(WTSVariant* cfg, IBaseDataMgr* bdMgr, WtUftDtMgr* dataMgr);

	/*!
	 * \brief 运行引擎
	 * 
	 * \param bAsync 是否异步运行，默认为false
	 * 
	 * \details 启动超高频交易引擎，开始处理市场数据和策略执行。
	 */
	void run(bool bAsync = false);

	/*!
	 * \brief Tick数据回调
	 * 
	 * \param stdCode 标准合约代码
	 * \param curTick 当前Tick数据
	 * 
	 * \details 处理接收到的Tick数据，分发给相关策略。
	 */
	void on_tick(const char* stdCode, WTSTickData* curTick);

	/*!
	 * \brief K线数据回调
	 * 
	 * \param stdCode 标准合约代码
	 * \param period 周期类型
	 * \param times 时间倍数
	 * \param newBar 新K线数据
	 * 
	 * \details 处理接收到的K线数据，分发给相关策略。
	 */
	void on_bar(const char* stdCode, const char* period, uint32_t times, WTSBarStruct* newBar);

	/*!
	 * \brief 初始化回调
	 * 
	 * \details 引擎初始化完成时的回调函数。
	 */
	void on_init(){}

	/*!
	 * \brief 交易时段开始回调
	 * 
	 * \details 交易时段开始时的回调处理。
	 */
	void on_session_begin();

	/*!
	 * \brief 交易时段结束回调
	 * 
	 * \details 交易时段结束时的回调处理。
	 */
	void on_session_end();

	/*!
	 * \brief 处理推送的行情数据
	 * 
	 * \param newTick 新的Tick数据
	 * 
	 * \details 处理从数据源推送过来的行情数据。
	 */
	virtual void handle_push_quote(WTSTickData* newTick) override;
	
	/*!
	 * \brief 处理推送的委托明细数据
	 * 
	 * \param curOrdDtl 当前委托明细数据
	 * 
	 * \details 处理从数据源推送过来的委托明细数据。
	 */
	virtual void handle_push_order_detail(WTSOrdDtlData* curOrdDtl) override;
	
	/*!
	 * \brief 处理推送的委托队列数据
	 * 
	 * \param curOrdQue 当前委托队列数据
	 * 
	 * \details 处理从数据源推送过来的委托队列数据。
	 */
	virtual void handle_push_order_queue(WTSOrdQueData* curOrdQue) override;
	
	/*!
	 * \brief 处理推送的成交数据
	 * 
	 * \param curTrans 当前成交数据
	 * 
	 * \details 处理从数据源推送过来的成交数据。
	 */
	virtual void handle_push_transaction(WTSTransData* curTrans) override;

public:
	/*!
	 * \brief 获取委托队列数据切片
	 * 
	 * \param sid 策略ID
	 * \param stdCode 标准合约代码
	 * \param count 数据条数
	 * \return 委托队列数据切片指针
	 * 
	 * \details 获取指定合约的委托队列历史数据。
	 */
	WTSOrdQueSlice* get_order_queue_slice(uint32_t sid, const char* stdCode, uint32_t count);
	
	/*!
	 * \brief 获取委托明细数据切片
	 * 
	 * \param sid 策略ID
	 * \param stdCode 标准合约代码
	 * \param count 数据条数
	 * \return 委托明细数据切片指针
	 * 
	 * \details 获取指定合约的委托明细历史数据。
	 */
	WTSOrdDtlSlice* get_order_detail_slice(uint32_t sid, const char* stdCode, uint32_t count);
	
	/*!
	 * \brief 获取成交数据切片
	 * 
	 * \param sid 策略ID
	 * \param stdCode 标准合约代码
	 * \param count 数据条数
	 * \return 成交数据切片指针
	 * 
	 * \details 获取指定合约的成交历史数据。
	 */
	WTSTransSlice* get_transaction_slice(uint32_t sid, const char* stdCode, uint32_t count);

public:
	/*!
	 * \brief 分钟结束回调
	 * 
	 * \param curDate 当前日期
	 * \param curTime 当前时间
	 * 
	 * \details 每分钟结束时的回调处理，用于触发相关的策略逻辑。
	 */
	void on_minute_end(uint32_t curDate, uint32_t curTime);

	/*!
	 * \brief 添加策略上下文
	 * 
	 * \param ctx 策略上下文智能指针
	 * 
	 * \details 向引擎中添加一个新的策略上下文。
	 */
	void addContext(UftContextPtr ctx);

	/*!
	 * \brief 获取策略上下文
	 * 
	 * \param id 策略ID
	 * \return 策略上下文智能指针
	 * 
	 * \details 根据策略ID获取对应的策略上下文。
	 */
	UftContextPtr	getContext(uint32_t id);

	/*!
	 * \brief 订阅委托队列数据
	 * 
	 * \param sid 策略ID
	 * \param stdCode 标准合约代码
	 * 
	 * \details 为指定策略订阅合约的委托队列数据推送。
	 */
	void sub_order_queue(uint32_t sid, const char* stdCode);
	
	/*!
	 * \brief 订阅委托明细数据
	 * 
	 * \param sid 策略ID
	 * \param stdCode 标准合约代码
	 * 
	 * \details 为指定策略订阅合约的委托明细数据推送。
	 */
	void sub_order_detail(uint32_t sid, const char* stdCode);
	
	/*!
	 * \brief 订阅成交数据
	 * 
	 * \param sid 策略ID
	 * \param stdCode 标准合约代码
	 * 
	 * \details 为指定策略订阅合约的成交数据推送。
	 */
	void sub_transaction(uint32_t sid, const char* stdCode);

private:
	uint32_t		_cur_date;		/*!< 当前日期 */
	uint32_t		_cur_time;		/*!< 当前时间，以1分钟为单位，如0900，如果时间是1分钟以后变0901，_cur_time也会变0901，这是为了CTA的方案 */
	uint32_t		_cur_raw_time;	/*!< 当前的真实时间 */
	uint32_t		_cur_secs;		/*!< 当前秒数，秒级时间 */
	uint32_t		_cur_tdate;		/*!< 当前交易日 */

	IBaseDataMgr*	_base_data_mgr;	/*!< 基础数据管理器 */
	WtUftDtMgr*		_data_mgr;		/*!< 数据管理器 */

	//By Wesley @ 2022.02.07
	//tick数据订阅表，first是contextid，second是复权选项（0-原始数据，1-前复权，2-后复权）
	/*!
	 * \typedef SubList
	 * \brief 订阅列表类型定义
	 * 
	 * \details 定义了策略ID的订阅列表。
	 */
	typedef faster_hashset<uint32_t> SubList;
	
	/*!
	 * \typedef StraSubMap
	 * \brief 策略订阅映射类型定义
	 * 
	 * \details 定义了合约代码到策略订阅列表的映射关系。
	 */
	typedef faster_hashmap<LongKey, SubList>	StraSubMap;
	StraSubMap		_tick_sub_map;		/*!< tick数据订阅映射表 */
	StraSubMap		_ordque_sub_map;	/*!< 委托队列订阅映射表 */
	StraSubMap		_orddtl_sub_map;	/*!< 委托明细订阅映射表 */
	StraSubMap		_trans_sub_map;		/*!< 成交明细订阅映射表 */
	StraSubMap		_bar_sub_map;		/*!< K线数据订阅映射表 */

	TraderAdapterMgr*	_adapter_mgr;	/*!< 交易适配器管理器 */

	/*!
	 * \typedef ContextMap
	 * \brief 策略上下文映射类型定义
	 * 
	 * \details 定义了策略ID到策略上下文的映射关系。
	 */
	typedef faster_hashmap<uint32_t, UftContextPtr> ContextMap;
	ContextMap		_ctx_map;			/*!< 策略上下文映射表 */

	WtUftRtTicker*	_tm_ticker;			/*!< UFT实时定时器 */
	WTSVariant*		_cfg;				/*!< 配置参数 */
};

NS_WTP_END